STM32F103串口重映射的应用 您所在的位置:网站首页 stm32f103手册 英文 STM32F103串口重映射的应用

STM32F103串口重映射的应用

2023-04-02 11:49| 来源: 网络整理| 查看: 265

首先要搞清楚什么是重映射?

简单来说就是不使用默认的端口,通过重映射寄存器的方法使这个外设的引脚映射到其它的端口,当然重映射可不能随便映射,这就要看官方的参考手册了。

本文就拿STM32F03C8T6串口1为例给大家演示一下、

首先要查找官方手册里的USART复用功能重映射,串口1默认的端口是PA9、PA10, 这里我查到串口1可以映射到PB6(TX)、PB7(RX)端口,如表47所示。

注意:因为是重映射是复用功能,使用功能我们必须要使能AFIO时钟。还需注意的是你映射到的是PB6、PB7端口,所以需要使能GPIOB时钟。还需要使能USART1的时钟,这个大家应该都知道。

//使能串口1时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //使能GPIOB时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能AFIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

初始化时钟完后,我们接下来就要就需要调用重映射函数,要选择要重映射的外设并使能它。

GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);

除了上面新的内容,其他内容就不在本文再做解释了,请移步去之前发的文章自行了解。

USART.c代码如下所示

void Usart_Config(void)//串口配置函数 { GPIO_InitTypeDef Gpio_Init; NVIC_InitTypeDef Nvic_Init; USART_InitTypeDef Usart_Init; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //打开串口1和要映射到的那个1端口和复用时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); Gpio_Init.GPIO_Pin = GPIO_Pin_6; //把PB6设置为TX,这里需要查开发手册,需注意:“不可随意映射,需看官方资料” Gpio_Init.GPIO_Mode = GPIO_Mode_AF_PP; Gpio_Init.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOB, &Gpio_Init); Gpio_Init.GPIO_Pin = GPIO_Pin_7; //把PB7设置为RX,这里也需查芯片手册,需注意:“不可随意映射,需看官方资料” Gpio_Init.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB, &Gpio_Init); GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE); //引脚映射初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); Nvic_Init.NVIC_IRQChannel = USART1_IRQn; Nvic_Init.NVIC_IRQChannelCmd = ENABLE; Nvic_Init.NVIC_IRQChannelPreemptionPriority = 1; Nvic_Init.NVIC_IRQChannelSubPriority = 2; NVIC_Init(&Nvic_Init); Usart_Init.USART_BaudRate = 115200; Usart_Init.USART_HardwareFlowControl = USART_HardwareFlowControl_None; Usart_Init.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; Usart_Init.USART_Parity = USART_Parity_No; Usart_Init.USART_StopBits = USART_StopBits_1; Usart_Init.USART_WordLength = USART_WordLength_8b; USART_Init(USART1, &Usart_Init); USART_Cmd(USART1, ENABLE); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); } void Send_Byte(USART_TypeDef* USARTx, uint16_t Data)//发送一个字符函数 { USART_SendData(USARTx, Data); while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET); } int fputc(int ch, FILE *f) //重定向:将C库中的printf重定向到USART { USART_SendData(USART1, (int8_t)ch); //ch待发送的字符 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); //等待发送完成 return ch; } void Send_String(USART_TypeDef* USARTx, char *str)    //发送字符串函数 { int8_t count = 0; do { Send_Byte(USARTx, *(str + count)); count++; }while(*(str + count) != '\0'); while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET); } void USART1_IRQHandler(void)    //串口中断服务函数 { char receive = 0; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { receive = USART_ReceiveData(USART1); if(receive == 'a') { Send_String(USART1, "收到AAAA\r\n"); } if(receive == 'b') { Send_String(USART1, "收到BBBB\r\n"); } } USART_ClearITPendingBit(USART1, USART_IT_RXNE); }

好啦,重映射基本就弄好了,接下来我们把完整的代码烧入芯片看一下吧。

串口助手与芯片连接如下:

效果如下:

如对您有帮助,可点亮♥,感激不尽。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有